const path = require('path');
const koaBody = require('koa-body');
const koaStatic = require('koa-static');
const todoRouter = require('./routers/todo');
const userRouter = require('./routers/user')
const jwt = require('jsonwebtoken')
const Koa = require('koa');
const { createSecretKey, verify } = require('crypto');
const app = new Koa();
const cors = require('koa-cors')

// 为应用使用中间件
// 静态文件中间件
app.use(koaStatic(path.join(__dirname, '../public')));
// 请求体 parse 中间件，用于 parse json 格式请求体
app.use(koaBody(
  {
    multipart: true,
    formidable: {
      maxFileSize: 10 * 1024 * 1024 // 默认2M
  },
  }
));

/** 若后面的路由抛错，则封装为错误响应返回
 * 错误响应格式为
 * {
 *   error: message
 * }
 */
app.use(
  cors({
    origin: function (ctx) { //设置允许来自指定域名请求
      if (ctx.url === '/test') {
        return '*'; // 允许来自所有域名请求
      }
      return 'http://localhost:4000'; //只允许http://localhost:8080这个域名的请求
    },
    maxAge: 10, //指定本次预检请求的有效期，单位为秒。
    credentials: true, //是否允许发送Cookie
    allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], //设置所允许的HTTP请求方法
    allowHeaders: ['Content-Type', 'Authorization', 'Accept'], //设置服务器支持的所有头信息字段
    exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'] //设置获取其他自定义字段
  })
)
app.use(async function errorHandler(ctx, next) {
  try {
    console.log('过了第二个中间件');
    await next();
  } catch (err) {
    // 抛出的错误可以附带 status 字段，代表 http 状态码
    // 若没有提供，则默认状态码为 500，代表服务器内部错误
    ctx.status = err.status || 500;
    ctx.body = { error: err.message };
  }
});
// app.use(async (ctx, next) => {
//   if (ctx.url == '/api/login' || ctx.url == '/api/register' || ctx.url == '/api/editor') {
//     await next()
//     return
//   } else {
//     const token = String(ctx.headers.authorization)
//     // 解析 token 如果解析失败 返回的是 null
//     const username = jwt.decode(token, 'yt')
//     console.log('这是解码后的nickname', username);
//     // 判断客户端是否传递了 token
//     if (token == 'undefined' || username == null) {
//       ctx.status = 400
//       ctx.body = {
//         data: null,
//         meta: {
//           msg: "token无效",
//           status: 400
//         }
//       }
//       return
//     }
//   }
//   next()
// })

// 为应用使用路由定义
// 使用待办事项业务路由
// app.use(todoRouter);
app.use(userRouter)

module.exports = app;
